/* 
 * File:   main.cpp
 * Author: Dianita
 *
 * Created on 2 de noviembre de 2013, 03:48 PM
 */

#include <cstdlib>
#include <iostream>
#include <list>

#include "Letra.h"
#include "Utiles.h"
#include "Automata.h"
#include "Separador.h"
#include "TablaTransiciones.h"

using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    Automata automata;

    Letra li("i");
    Letra ln("n");
    Letra lt("t");
    Letra lp("p");
    Letra lu("u");
    Letra lb("b");
    Letra ll("l");
    Letra lc("c");
    Letra lr("r");
    Letra lv("v");
    Letra la("a");
    Letra le("e");
    Letra lguion("-");
    Letra ligual("=");

    list<Letra> alfabeto;
    alfabeto.push_back(li);
    alfabeto.push_back(ln);
    alfabeto.push_back(lt);
    alfabeto.push_back(lp);
    alfabeto.push_back(lu);
    alfabeto.push_back(lb);
    alfabeto.push_back(ll);
    alfabeto.push_back(lc);
    alfabeto.push_back(lr);
    alfabeto.push_back(lv);
    alfabeto.push_back(la);
    alfabeto.push_back(le);
    alfabeto.push_back(lguion);
    alfabeto.push_back(ligual);

    Estado q1("1");
    Estado q2("2");
    Estado q3("3");
    Estado q4("4");
    Estado q5("5");
    Estado q6("6");
    Estado q7("7");
    Estado q8("8");
    Estado q9("9");
    Estado q10("10");
    Estado q11("11");
    Estado q12("12");
    Estado q13("13");
    Estado q14("14");
    Estado q15("15");
    Estado q16("16");
    Estado q17("17");
    Estado q18("18");
    Estado q19("19");


    list<Estado> estados;
    estados.push_back(q1);
    estados.push_back(q2);
    estados.push_back(q3);
    estados.push_back(q4);
    estados.push_back(q5);
    estados.push_back(q6);
    estados.push_back(q7);
    estados.push_back(q8);
    estados.push_back(q9);
    estados.push_back(q10);
    estados.push_back(q11);
    estados.push_back(q12);
    estados.push_back(q13);
    estados.push_back(q14);
    estados.push_back(q15);
    estados.push_back(q16);
    estados.push_back(q17);
    estados.push_back(q18);
    estados.push_back(q19);

    list<Estado> estadosFinales;
    estadosFinales.push_back(q4);
    estadosFinales.push_back(q10);
    estadosFinales.push_back(q16);
    estadosFinales.push_back(q18);
    estadosFinales.push_back(q19);

    Transicion t1(q1, li, q2);
    Transicion t2(q1, lp, q5);
    Transicion t3(q1, lguion, q17);
    Transicion t4(q1, ligual, q19);
    Transicion t5(q2, ln, q3);
    Transicion t6(q3, lt, q4);
    Transicion t7(q5, lu, q6);
    Transicion t8(q5, lr, q11);
    Transicion t9(q6, lb, q7);
    Transicion t10(q7, ll, q8);
    Transicion t11(q8, li, q9);
    Transicion t12(q9, lc, q10);
    Transicion t13(q11, li, q12);
    Transicion t14(q12, lv, q13);
    Transicion t15(q13, la, q14);
    Transicion t16(q14, lt, q15);
    Transicion t17(q15, le, q16);
    Transicion t18(q17, lguion, q18);


    list<Transicion> transiciones;
    transiciones.push_back(t1);
    transiciones.push_back(t2);
    transiciones.push_back(t3);
    transiciones.push_back(t4);
    transiciones.push_back(t5);
    transiciones.push_back(t6);
    transiciones.push_back(t7);
    transiciones.push_back(t8);
    transiciones.push_back(t9);
    transiciones.push_back(t10);
    transiciones.push_back(t11);
    transiciones.push_back(t12);
    transiciones.push_back(t13);
    transiciones.push_back(t14);
    transiciones.push_back(t15);
    transiciones.push_back(t16);
    transiciones.push_back(t17);
    transiciones.push_back(t18);

    automata.setAlfabeto(alfabeto);
    automata.setEstadoInicial(q1);
    automata.setListaEstados(estados);
    automata.setTransiciones(transiciones);
    automata.setListaEstadosFinales(estadosFinales);

    list<string> palabras;

    palabras.push_back("int");
    palabras.push_back("public");
    palabras.push_back("private");
    palabras.push_back("--");
    palabras.push_back("=");

    /*GENERA EL ALFABETO DADAS LAS PALABRAS
    EJEMPLO: DADO int, public, private, --,= GENERA {i n t p u b l c r v a e - =}
    automata.imprimirAlfabeto(automata.generarAlfabeto(palabras));*/

    /*VALIDA LAS CADENAS
    automata.correrAutomataPalabras(palabras);
     */


    Separador sEspacio("}");
    Separador sTab("{");
    list<Separador> separadores;

    separadores.push_back(sEspacio);
    separadores.push_back(sTab);



    int filas = estados.size() + 2;
    int columnas = alfabeto.size() + separadores.size() + 1;
    TablaTransiciones tt(estados, alfabeto, separadores, transiciones);
    tt.construirMatriz(filas,columnas);
    //tt.construirMatriz(filas, columnas);
    //tt.imprimirMatriz();
    
//    Utiles u;
//    cout<< u.obtenerEstadoFinal(transiciones, q5, lr).getNombre() << endl;
    return 0;
}

